#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=2e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
//双序列多半二维dp,且多为固定一个不动而另一个动的情况
//f[i][j] i表示a前i个数,j表示b以j结尾,且存在上升且相同的子序列最大的状态
int a[1100],b[1100],f[1100][1100],n,m;
int main()
{
	close();
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];

	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(b[j]!=a[i]) f[i][j]=f[i-1][j];//不包含a[i],以b[j]结尾a取前i-1个数的子序列最长状态
			else
			{
				for(int k=1;k<j;k++)//这里就是最长上升子序列的板子
				{
					if(f[i][j]<f[i-1][k]&&b[k]<b[j]) f[i][j]=f[i-1][k];//这里b[k]<b[j]是应为要以b[j]结尾
				}
				f[i][j]++;//以j结尾这一组
			}
			
		}
	}
	
	int mx=0;
	for(int i=1;i<=m;i++) mx=max(f[n][i],mx);
	cout<<mx<<'\n';

	return 0;
}